package com.luxsoft.sw3.replica;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.log4j.Logger;
import org.hibernate.ReplicationMode;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.luxsoft.sw3.cfd.model.ComprobanteFiscal;
import com.luxsoft.sw3.services.POSDBUtils;
import com.luxsoft.sw3.services.Services;
import com.luxsoft.utils.LoggerHelper;

/**
 * Replicador para comprobantes fiscales digitales
 * 
 * @author Ruben Cancino Ramos
 *
 */
public class ReplicadorDeCFD {
	
	private Logger logger=LoggerHelper.getLogger();
	
	private Set<Long> sucursales=new HashSet<Long>();
	
	
	/**
	 * Importa todos los CFD pendientes desde todas las sucursales 
	 * 
	 */
	public void importar(){
		for(Long sucursalId:getSucursales()){
			importar(sucursalId);
		}
	}
	
	
	/**
	 * Importa todos los  CFD  <b>PENDIENTES</b> de una sucursal a la base de datos central
	 * 
	 * @param sucursalId
	 */
	public void importar(Long sucursalId){
		HibernateTemplate source=ReplicaServices.getInstance().getHibernateTemplate(sucursalId);
		List<ComprobanteFiscal> pendientes=source
					.find("from ComprobanteFiscal c where c.importado is null");
		if(pendientes.size()==0)
			return;
		logger.info("Registros CFD pendientes: "+pendientes.size());
		for(ComprobanteFiscal cfd:pendientes){
			try {
				cfd.setImportado(new Date());
				Services.getInstance().getHibernateTemplate().replicate(cfd, ReplicationMode.OVERWRITE);
				source.update(cfd);
				logger.info("Registro CFD importado: "+cfd);
			} catch (Exception e) {				
				logger.error("Error importando CFD: "+cfd
						+"  "+ExceptionUtils.getRootCauseMessage(e),e);				
			}		
		}
	}
	
	
	
	public ReplicadorDeCFD addSucursal(Long... sucursales){
		for (Long sucursalId:sucursales){
			getSucursales().add(sucursalId);
		}
		return this;
	}
	
	public Set<Long> getSucursales() {
		return sucursales;
	}

	public void setSucursales(Set<Long> sucursales) {
		this.sucursales = sucursales;
	}
	
	public static void main(String[] args) {
		POSDBUtils.whereWeAre();
		ReplicadorDeCFD replicador=new ReplicadorDeCFD();
		replicador.addSucursal(2L,3L,5L,6L);		
		replicador.importar();
		;
		
	}

}
